
#include <string.h>

#include "constantes.h"
#include "estructuras.h"
#include "cache.h"

Sector cache[SIZE_CACHE]; /*** fullSector esta definida en estructuras.h ***/

int hit;
int cantidadDeAccesos;

/*** posicionCache: recibe un sector y en caso de que este, dice en que posicion esta.
              Es una funcion auxiliar para actualizarCache().***/

void iniciarCache ()
{
	int i;
	Sector aux;

	cantidadDeAccesos = 0; /*** valor inicial de cantidadDeAccesos ***/
	hit = 0; /*** valor inicial de hit ***/

	aux.idSector = -1;

	for (i = 0; i < SIZE_CACHE; i++)
	{
		cache[i] = aux;
    }
}

int posicionCache(int sector)
{
         int i;
         
		 for (i = 0; i < SIZE_CACHE; i++)
		 {
             if(cache[i].idSector == sector) 
				{ 
					return i; 
				} 
         }
         return NO_ESTA_EN_CACHE; /*** Si no esta en cache devuelve -1.***/
}


/*** 
	COMMENT: el return no puede ser 0, porque el sector 0 es un sector valido
	de ahi #define NO_ESTA_EN_CACHE -1
***/


/*** estaEnCache: recibe un sector y devuelve -1/0 dependiendo si esta en cache o no.***/
int estaEnCache(int sector) {
         int i;
         for (i = 0; i < SIZE_CACHE; i++) 
		 {
             if(cache[i].idSector == sector) 
			 {
				return ESTA_EN_CACHE; 
			 } 
         }
         return NO_ESTA_EN_CACHE;
}

/*** actualizarCache: recibe un sector y un dato y actualiza el array de la cache
                  siguiendo un criterio LRU ***/

int actualizarCache(Sector unSector) {

         int i;

		 if (NO_ESTA_EN_CACHE == estaEnCache(unSector.idSector)) 
		 {
            
			/*** Si no esta en cache entonces corro todos
			   una posicion para abajo y lo agrego en la
			   primer posicion ***/
            
			for (i = (SIZE_CACHE-1); i > 0; i--)
			{
				cache[i] = cache[i-1];
			}    

		 }
		 else 
		 {
              
			/*** Si esta en cache corro todos una posicion para abajo
				a partir de la posicion en la que este el sector
				y lo agrego en primer lugar ***/

			for (i = posicionCache(unSector.idSector); i > 0; i--) 
			{
				cache[i] = cache[i-1];
			}      

			 /***hit = hit + 1;***/
		 }

		 cache[TOP_CACHE] = unSector;

		 return 1;/***termino la funcion***/
}
